package jp.chiheisen.httpserveranywhere;

import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

/**
 * 待ち受けホストの列挙体です。
 * 
 * @author YujiYamamoto
 * @since 1.0
 */
public enum Host{
	LOOPBACK{
		public InetSocketAddress createAddress(int port){
			return new InetSocketAddress("localhost", port);
		}
		public List<InetAddress> getAddress() throws IOException{
			InetAddress address = Inet4Address.getByName("localhost");
			return Collections.singletonList(address);
		}
	},
	WILD{
		public InetSocketAddress createAddress(int port){
			return new InetSocketAddress(port);
		}
		public List<InetAddress> getAddress() throws IOException{
			Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
			if (interfaces == null){
				return Collections.emptyList();
			}
		
			List<InetAddress> list = new ArrayList<InetAddress>();
		    for(NetworkInterface nic : Collections.list(interfaces)){
		    	list.addAll(Collections.list(nic.getInetAddresses()));
		    }
		    return list;
		}
	};
	
	/**
	 * このホストのIPソケットアドレスを生成します。
	 * 
	 * @param port ポート番号
	 * @return IPソケットアドレス
	 */
	public abstract InetSocketAddress createAddress(int port);
	
	/**
	 * このホストが持つIPアドレスを取得します。
	 * 
	 * @return IPアドレス
	 */
	public abstract List<InetAddress> getAddress() throws IOException;
}